package scenic.study.designmode.behaviour_type.responsibility;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by scenic on 2018/5/7.
 * <p>
 * <p>
 * 公司针对支付过定金的用户有一定的优惠政策。在正式购买后，已经支付过 500 元定金的用
 * 户会收到 100 元的商城优惠券，200 元定金的用户可以收到 50 元的优惠券，而之前没有支付定金
 * 的用户只能进入普通购买模式，也就是没有优惠券，且在库存有限的情况下不一定保证能买到。
 * <p>
 * <p>
 * orderType：表示订单类型（定金用户或者普通购买用户），code 的值为 1 的时候是 500 元
 * 定金用户，为 2 的时候是 200 元定金用户，为 3 的时候是普通购买用户。
 * <p>
 * pay：表示用户是否已经支付定金，值为 true 或者 false, 虽然用户已经下过 500 元定金的
 * 订单，但如果他一直没有支付定金，现在只能降级进入普通购买模式。
 * <p>
 * stock：表示当前用于普通购买的手机库存数量，已经支付过 500 元或者 200 元定金的用
 * 户不受此限制
 */
public class TestChainClient {

    @Test
    public void run() {

        Chain chain = new Chain();
        chain.add(new Order500());
        chain.add(new Order200());
        chain.add(new OrderNormal());

        Chain chain1 = new Chain();
        chain1.add(chain);
        chain1.doDealRequest(chain, new Param(3, true, 500));

    }



    private static class Order200 implements ExecuteFactor {

        @Override
        public void doDealRequest(Chain chain, Param param) {
            if (param.orderType == 2 && param.pay == true) {
                System.out.println("200 元定金预购，得到 50 优惠券");
            } else {
                chain.doDealRequest(chain, param); // 我不知道下一个节点是谁，反正把请求往后面传递
            }
        }
    }
    private static class Order500 implements ExecuteFactor {

        @Override
        public void doDealRequest(Chain chain, Param param) {
            if (param.orderType == 1 && param.pay == true) {
                System.out.println("500 元定金预购，得到 100 优惠券");
            } else {
                chain.doDealRequest(chain, param);
            }
        }
    }
    private static class OrderNormal implements ExecuteFactor {

        @Override
        public void doDealRequest(Chain chain, Param param) {
            if (param.stock > 0) {
                System.out.println("普通购买，无优惠券");
            } else {
                System.out.println("手机库存不足");
            }
        }
    }

}












